package PhotovoltaicPowerStation.GUI;

import PhotovoltaicPowerStation.Equipments.Combiner;
import PhotovoltaicPowerStation.Equipments.Reverse;

import javax.swing.*;
import java.awt.*;
import java.io.*;

/**
 * @Description:光伏发电主界面程序
 * 界面设计：由于需要增删改查，同时有两种设备
 * 使用下拉框选择设备类型，下拉框选项组合不同在前端显示也不同
 * 用文本框获取用户输入的设备名称，设备状态，设备编号，设备输入电压，设备输出电压，设备输出功率
 * @Author:AMark
 * @Date: 11/3/2023
 */
public class SysUI {
    private JFrame frame;

    //定义增删改查四个按钮，放在主界面上
    private JButton addBtn, delBtn, modyBtn, queryBtn;
    //下拉框选择设备类型
    private JComboBox<String> ADMQcomboBox;
    //定义两个面板，一个面板用于显示逆变器，一个面板用于显示汇流箱
    private JPanel reversePanel, combinerPanel;
    //定义逆变器面板的文本框


    private JTextField inVoltT, outVoltT, outPowerT;
    //定义汇流箱面板的文本框
    private JTextField allVoltT, allCurrentT;
    //定义逆变器面板的标签
    private JLabel inVoltL, outVoltL, outPowerL;
    //定义汇流箱面板的标签
    private JLabel allVoltL, allCurrentL;
    //设备名称和设备状态的标签和文本框
    private JLabel nameL, statusL;
    private JTextField nameT, statusT;
    //定义显示面板用于显示查询到的逆变器和汇流箱的信息
    private JPanel showPanel;
    //用标签显示查询到的逆变器和汇流箱的信息
    private JLabel showL;
    //存放数据的文件路径,使用的是相对路径
    private static String FilePath = "PhotovoltaicPowerStation/manager.ser";


    SysUI(String Title) {
        //取名字
        frame = new JFrame(Title);
        //初始化下拉选项，添加逆变器和汇流箱
        ADMQcomboBox = new JComboBox<>();
        ADMQcomboBox.addItem("逆变器");
        ADMQcomboBox.addItem("汇流箱");
        //初始化两个Panel,同时将两个Panel都设置成不可见
        reversePanel = new JPanel();
        combinerPanel = new JPanel();
        reversePanel.setVisible(false);
        combinerPanel.setVisible(false);
        //初始化设备名称和设备状态的标签和文本框
        nameL = new JLabel("设备名称");
        statusL = new JLabel("设备状态");
        nameT = new JTextField(10);
        statusT = new JTextField(10);
        //初始化逆变器面板的文本框,并将文本框和相应的标签按顺序流式放置到面板2中
        Panel panel1 = new Panel();
        panel1.setLayout(new GridLayout(2, 2));
        panel1.add(nameL);
        panel1.add(nameT);
        panel1.add(statusL);
        panel1.add(statusT);
        //初始化逆变器面板的文本框,并将文本框和相应的标签按顺序流式放置到面板1中
        inVoltT = new JTextField(10);
        outVoltT = new JTextField(10);
        outPowerT = new JTextField(10);
        inVoltL = new JLabel("输入电压");
        outVoltL = new JLabel("输出电压");
        outPowerL = new JLabel("输出功率");
        reversePanel.add(inVoltL);
        reversePanel.add(inVoltT);
        reversePanel.add(outVoltL);
        reversePanel.add(outVoltT);
        reversePanel.add(outPowerL);
        reversePanel.add(outPowerT);
        //初始化汇流箱面板的文本框,并将文本框和相应的标签按顺序流式放置到面板2中
        allVoltT = new JTextField(10);
        allCurrentT = new JTextField(10);
        allVoltL = new JLabel("总电压");
        allCurrentL = new JLabel("总电流");
        combinerPanel.add(allVoltL);
        combinerPanel.add(allVoltT);
        combinerPanel.add(allCurrentL);
        combinerPanel.add(allCurrentT);
        //初始化增删改查四个按钮
        addBtn = new JButton("增加");
        delBtn = new JButton("删除");
        modyBtn = new JButton("修改");
        queryBtn = new JButton("查询");
        //整体布局采用将下拉框和面按钮放在左侧，面板统一在右侧的方式,同时按钮不能有覆盖
        //设置布局管理器
        frame.setLayout(new BorderLayout());
        //设置按钮面板
        JPanel btnPanel = new JPanel();
        btnPanel.setLayout(new GridLayout(4, 1));
        btnPanel.add(addBtn);
        btnPanel.add(delBtn);
        btnPanel.add(modyBtn);
        btnPanel.add(queryBtn);
        //设置下拉框面板
        JPanel comboBoxPanel = new JPanel();
        comboBoxPanel.setLayout(new GridLayout(1, 1));
        comboBoxPanel.add(ADMQcomboBox);
        //将panel2放在下拉框面板的下方
        comboBoxPanel.add(panel1);
        //设置面板
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(2, 1));
        panel.add(reversePanel);
        panel.add(combinerPanel);
        //将按钮面板和下拉框面板放在左侧
        frame.add(btnPanel, BorderLayout.WEST);
        frame.add(comboBoxPanel, BorderLayout.NORTH);
        //将面板放在右侧
        frame.add(panel, BorderLayout.CENTER);
        //设置窗口大小
        frame.setSize(800, 600);
        //设置窗口可见
        frame.setVisible(true);
        //设置窗口关闭方式
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        //开始写功能函数
        //检测下拉框选项，如果选的是逆变器，就显示逆变器面板，同时隐藏汇流箱面板
        ADMQcomboBox.addActionListener(e -> {
            if (ADMQcomboBox.getSelectedItem().equals("逆变器")) {
                reversePanel.setVisible(true);
                combinerPanel.setVisible(false);
            } else if (ADMQcomboBox.getSelectedItem().equals("汇流箱")) {
                reversePanel.setVisible(false);
                combinerPanel.setVisible(true);
            }
        });
        //补充按钮功能,添加设备信息，首先检测下拉框选项，然后根据下拉框选项的不同，获取用户输入的信息，然后将信息写入到文件中，实现Operation中的Add类
        addBtn.addActionListener(e -> {
            if (ADMQcomboBox.getSelectedItem().equals("逆变器")) {
                //获取用户输入的信息
                String name = nameT.getText();
                String status = statusT.getText();
                String inVolt = inVoltT.getText();
                String outVolt = outVoltT.getText();
                String outPower = outPowerT.getText();
                //将信息写入到文件中，通过序列化的方法将对象写入到文件中
                Reverse reverse = new Reverse(name, Integer.parseInt(status), Integer.parseInt(inVolt), Integer.parseInt(outVolt), Integer.parseInt(outPower));
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("FilePath")));
                    oos.writeObject(reverse);
                    //消息弹窗显示添加成功
                    JOptionPane.showMessageDialog(null, "添加成功");
                    oos.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            } else if (ADMQcomboBox.getSelectedItem().equals("汇流箱")) {
                //获取用户输入的信息
                String name = nameT.getText();
                String status = statusT.getText();
                String allVolt = allVoltT.getText();
                String allCurrent = allCurrentT.getText();
                //将信息写入到文件中,通过序列化实现
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("FilePath")));
                    oos.writeObject(new Combiner(name, Integer.parseInt(status), Integer.parseInt(allVolt), Integer.parseInt(allCurrent)));
                    //消息弹窗显示添加成功
                    JOptionPane.showMessageDialog(null, "添加成功");
                    oos.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            } else {
                System.out.println("操作失败！");
            }
        });
        //删除设备信息，首先检测下拉框选项，然后根据下拉框选项的不同，获取用户输入的信息，然后将信息写入到文件中，实现Operation中的Delete类，从text中获取用户输入
        delBtn.addActionListener(e -> {
            if (ADMQcomboBox.getSelectedItem().equals("逆变器")) {
                //获取用户输入的信息
                String name = nameT.getText();
                //从文件中以对象的形式反序列化读取信息，并匹配用户输入的信息，如果匹配成功，就删除该对象
                try {
                    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("FilePath")));
                    Reverse reverse = (Reverse) ois.readObject();
                    if (reverse.getName().equals(name)) {
                        reverse = null;
                        //消息弹窗显示删除成功
                        JOptionPane.showMessageDialog(null, "删除成功");
                    }
                    ois.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                } catch (ClassNotFoundException classNotFoundException) {
                    classNotFoundException.printStackTrace();
                }
            } else if (ADMQcomboBox.getSelectedItem().equals("汇流箱")) {
                //获取用户输入的信息
                String name = nameT.getText();
                //从文件中以对象的形式反序列化读取信息，并匹配用户输入的信息，如果匹配成功，就删除该对象
                try {
                    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("FilePath")));
                    Combiner combiner = (Combiner) ois.readObject();
                    if (combiner.getName().equals(name)) {
                        combiner = null;
                        //消息弹窗显示删除成功
                        JOptionPane.showMessageDialog(null, "删除成功");
                    }
                    ois.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                } catch (ClassNotFoundException classNotFoundException) {
                    classNotFoundException.printStackTrace();
                }
            }else {
                System.out.println("操作失败！");
            }
        });
        //修改信息，首先检测下拉框选项，然后根据下拉框选项的不同，获取用户输入的信息，然后将信息写入到文件中，实现Operation中的Modify类，从text中获取用户输入
        modyBtn.addActionListener(e -> {
            if (ADMQcomboBox.getSelectedItem().equals("逆变器")) {
                //获取用户输入的信息
                String name = nameT.getText();
                String status = statusT.getText();
                String inVolt = inVoltT.getText();
                String outVolt = outVoltT.getText();
                String outPower = outPowerT.getText();
                //将信息写入到文件中,使用序列化
                try {
                    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("FilePath")));
                    dos.writeUTF(name);
                    dos.writeUTF(status);
                    dos.writeUTF(inVolt);
                    dos.writeUTF(outVolt);
                    dos.writeUTF(outPower);
                    dos.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            } else if (ADMQcomboBox.getSelectedItem().equals("汇流箱")) {
                //获取用户输入的信息
                String name = nameT.getText();
                String status = statusT.getText();
                String allVolt = allVoltT.getText();
                String allCurrent = allCurrentT.getText();
                //将信息写入到文件中
                try {
                    DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("FilePath")));
                    dos.writeUTF(name);
                    dos.writeUTF(status);
                    dos.writeUTF(allVolt);
                    dos.writeUTF(allCurrent);
                    dos.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }else {
                System.out.println("操作失败！");
            }
        });
        //查询目标信息，没有就弹窗不存在信息，有就显示信息在showpanel上面
        queryBtn.addActionListener(e -> {
            if (ADMQcomboBox.getSelectedItem().equals("逆变器")) {
                //获取用户输入的信息
                String name = nameT.getText();
                //从文件中以对象的形式反序列化读取信息，并匹配用户输入的信息，如果匹配成功，就显示该对象
                try {
                    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("FilePath")));
                    Reverse reverse = (Reverse) ois.readObject();
                    if (reverse.getName().equals(name)) {
                        //显示该对象
                        showPanel = new JPanel();
                        showPanel.setLayout(new GridLayout(1, 1));
                        showPanel.add(new JLabel(reverse.toString()));
                        frame.add(showPanel, BorderLayout.SOUTH);
                        //消息弹窗显示查询成功
                        JOptionPane.showMessageDialog(null, "查询成功");
                    } else {
                        //消息弹窗显示不存在该信息
                        JOptionPane.showMessageDialog(null, "不存在该信息");
                    }
                    ois.close();
                } catch (FileNotFoundException fileNotFoundException) {
                    fileNotFoundException.printStackTrace();
                } catch (ClassNotFoundException classNotFoundException) {
                    classNotFoundException.printStackTrace();
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                }
            } else if (ADMQcomboBox.getSelectedItem().equals("汇流箱")) {
                //获取用户输入的信息
                String name = nameT.getText();
                //从文件中以对象的形式反序列化读取信息，并匹配用户输入的信息，如果匹配成功，就显示该对象
                try {
                    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("FilePath")));
                    Combiner combiner = (Combiner) ois.readObject();
                    if (combiner.getName().equals(name)) {
                        //显示该对象
                        showPanel = new JPanel();
                        showPanel.setLayout(new GridLayout(1, 1));
                        showPanel.add(new JLabel(combiner.toString()));
                        frame.add(showPanel, BorderLayout.SOUTH);
                        //消息弹窗显示查询成功
                        JOptionPane.showMessageDialog(null, "查询成功");
                    } else {
                        //消息弹窗显示不存在该信息
                        JOptionPane.showMessageDialog(null, "不存在该信息");
                    }
                } catch (FileNotFoundException ex) {
                    throw new RuntimeException(ex);
                } catch (IOException ex) {
                    throw new RuntimeException(ex);
                } catch (ClassNotFoundException ex) {
                    throw new RuntimeException(ex);
                }
            }else {
                System.out.println("操作失败！");
            }
        });
    }
    public static void main (String[]args){
        new SysUI("光伏发电系统");
    }
}